// 简答题一
// => 10 输出10 
// 原因: 函数执行时变量i是全局变量,此时循环已经执行完,i = 10

// 简答题二
// 报错 tmp未声明就引用了
// 在{}块级作用域内 let声明变量没有声明提升 在声明之前引用变量存在间歇性死区

// 简答题三
var arr = [12, 34, 32, 89, 4]
let min = Math.min(...arr)
console.log(min)

// 简答题四
// var: 1. 存在声明提升 2. 声明之后可修改 3. 声明时可不赋值
// let: 1. 不存在声明提升 2. 声明之后可修改 3. 声明时可不赋值
// const: 1. 不存在声明提升 2. 声明之后不可修改 3. 声明时必须赋值

// 简答题五
// => 20 输出20
//原因: obj.fn()调用 fn的this指向obj, 定时器中是箭头函数不改变this指向

// 简答题六
// Symbol类型的用途
// 1. 最主要的作用就是为对象添加独一无二的属性名 2. Symbol类型数据具有唯一性
// ES6 引入了一种新的原始数据类型Symbol，表示独一无二的值
// 凡是属性名属于 Symbol 类型，就都是独一无二的，可以保证不会与其他属性名产生冲突。

// 简答题七
// 深拷贝：在复杂对象里，对象的属性也是对象的时候；
// 浅拷贝：只复制一层对象，当对象的属性是引用类型时，实质上复制的是其引用，当引用指向的值发生变化的时候，原对象属性值也跟着变化；

// 简答题八
// JavaScript是弱类型且动态类型(缺失了类型系统的可靠性)的语言且JavaScript没有编译环节
// TypeScript 基于JavaScript之上的语言,解决了JavaScript类型系统的问题
// TypeScript是JavaScript的超集(superset)、扩展集, 任何一种JavaScript运行环境都支持TypeScript


// 简答题九
// TypeScript 基于JavaScript之上的语言,解决了JavaScript类型系统的问题
// TypeScript是JavaScript的超集(superset)、扩展集, 任何一种JavaScript运行环境都支持TypeScript
// 功能更为强大, 生态更健全、更完善(相比Flow)
// 前端领域的第二语言
// TypeScript属于[渐进式]
// 缺点一: 语言本身多了很多概念
// 缺点二: 项目初期, TypeScript会增加一些成本

// 简答题十
// 核心思想: 设置引用数, 判断当前引用数是否为0
// 程序运行的时候会对被引用的对象进行计数, 每引用一次就在当前引用数上加1, 当对象引用数为0的时候立即回收
// 引用计数器(被弃用的原因, 性能不好)
// 引用关系改变时修改引用数字
// 引用数字为0时立即回收
// 引用计数的优点
    // 发现垃圾时立即回收
    // 减少程序卡顿时间
    // 最大限度减少程序暂停(内存即将占满,立即清除)
// 引用计数的缺点
    // 无法回收循环引用的对象
    // 时间(资源)开销大

// 简答题十一
// 核心思想: 分为标记和清除两个阶段
// 遍历所有对象找标记活动对象(对象、子对象递归标记)
// 清除阶段会执行整理, 移动对象位置(为了地址上连续, 将碎片化的空间连接到一起)
// 遍历所有对象清除没有标记对象
// 回收相应的空间(回收的空间放到空闲链表上方便后续使用)

// 简答题十二
// 新生代对象回收实现
    // 回收过程采用复制算法 + 标记整理
    // 新生代内存去分为二个等大小空间
    // 使用空间为From, 空闲空间为To
    // 活动对象存储于From空间
    // 标记整理后将活动对象拷贝至To
    // From与To交换空间, 完成释放
// 新生代对象回收实现-说明
    // 拷贝过程中可能出现晋升
    // 晋升就是将新生代对象移动至老生代
        // 一轮GC还存活的新生代需要晋升
        // To空间的使用率超过25%(移动至老生代: From和To会交换)

// 简答题十三
// 老生代区域对象回收使用增量标记
// 标记增量: 整个垃圾回收过程拆分成多个小步,替代整个垃圾回收, 实现程序执行和垃圾回收交替执行

























